//引入axios的核心库以及内部封装好的数据类型
import axios, { AxiosInstance, AxiosRequestConfig } from 'axios'
//引入封装好的接口类型
import { ResultData } from './interface'
import qsString from 'querystring'

//定义的配置对象
let config = {
    baseURL:'/api'
}

//定义一个类 用于封装 请求方法以及拦截器
class Http {
    http: AxiosInstance
    //构造器
    constructor(config: AxiosRequestConfig) {
        //重新实例化
        this.http = axios.create(config)
        //请求拦截器
        this.http.interceptors.request.use(req => req)
        //响应拦截器
        this.http.interceptors.response.use(res => res.data)
    }
    //方法
    /* 
     url  必传参数
     params 可有可无
    */
    get<T>(url: string, params?: object): Promise<ResultData<T>> {
        return this.http.get(url, {
            params
        })
    }
    /* 
 url  必传参数
 params 可有可无
 isFile
*/
    post<T>(url: string, params?: any, isFile: boolean = false): Promise<ResultData<T>> {
        let data:any={}
        if (isFile) {
            //有文件
            data = new FormData()
            // ts中不支持for in 
            // for(let i in params){
            //     data.append(i,params[i])
            // }
            for (const [key, val] of Object.entries(params)) {
                data.append(key, val)
            }
        } else {
            data = qsString.stringify(params)
        }
        return this.http.post(url, data)
    }
}

//实例化当前类并导出
export default new Http(config)